#!/usr/bin/env bash

# ========================================
# WonderTrader Release 构建脚本 (增强版)
# 功能：编译项目并提供详细的日志记录
# 作者：自动生成优化版本
# ========================================

# 脚本开始时间
START_TIME=$(date +%s)
BUILD_TIMESTAMP=$(date +%Y%m%d_%H%M%S)

# 检测CPU核心数
CPU_CORES=$(nproc)
# 使用70%的CPU核心数进行编译，并四舍五入到最接近的整数
COMPILE_JOBS=$(echo "$CPU_CORES * 0.7" | bc | xargs printf "%.0f")
# 确保至少使用1个线程
if [ $COMPILE_JOBS -lt 1 ]; then
    COMPILE_JOBS=1
fi
# ========================================
# 日志配置
# ========================================

# 确保构建目录存在
if [ ! -d "./build_all" ]; then
    mkdir -p build_all
fi

# 创建日志目录
LOG_DIR="./build_all/logs"
mkdir -p "$LOG_DIR"

# 日志文件路径（使用绝对路径）
BUILD_LOG="$(pwd)/$LOG_DIR/build_${BUILD_TIMESTAMP}.log"
ERROR_LOG="$(pwd)/$LOG_DIR/errors_${BUILD_TIMESTAMP}.log"
WARNING_LOG="$(pwd)/$LOG_DIR/warnings_${BUILD_TIMESTAMP}.log"
SUMMARY_LOG="$(pwd)/$LOG_DIR/build_summary_${BUILD_TIMESTAMP}.log"
LATEST_LOG="$(pwd)/$LOG_DIR/latest_build.log"

# 清理旧的latest_build.log链接
rm -f "$LATEST_LOG"

# 日志函数
log_info() {
    local message="[$(date '+%Y-%m-%d %H:%M:%S')] [INFO] $1"
    echo "$message" | tee -a "$BUILD_LOG"
}

# 显示带颜色的进度信息
log_progress() {
    local message="[$(date '+%Y-%m-%d %H:%M:%S')] [PROGRESS] $1"
    echo -e "\033[36m$message\033[0m" | tee -a "$BUILD_LOG"
}

log_warning() {
    local message="[$(date '+%Y-%m-%d %H:%M:%S')] [WARNING] $1"
    echo -e "\033[33m$message\033[0m" | tee -a "$BUILD_LOG" "$WARNING_LOG"
}

log_error() {
    local message="[$(date '+%Y-%m-%d %H:%M:%S')] [ERROR] $1"
    echo -e "\033[31m$message\033[0m" | tee -a "$BUILD_LOG" "$ERROR_LOG"
}

log_success() {
    local message="[$(date '+%Y-%m-%d %H:%M:%S')] [SUCCESS] $1"
    echo -e "\033[32m$message\033[0m" | tee -a "$BUILD_LOG"
}

log_header() {
    local message="$1"
    echo "========================================" | tee -a "$BUILD_LOG"
    echo "$message" | tee -a "$BUILD_LOG"
    echo "========================================" | tee -a "$BUILD_LOG"
}

# ========================================
# 构建信息记录
# ========================================

# 记录构建开始信息
log_header "WonderTrader Release 构建开始"
log_info "构建时间戳: $BUILD_TIMESTAMP"
log_info "检测到 $CPU_CORES 个CPU核心，将使用 $COMPILE_JOBS 个线程进行并行编译"
log_info "日志文件位置: $BUILD_LOG"
log_info "错误日志: $ERROR_LOG"
log_info "警告日志: $WARNING_LOG"
log_info "构建摘要: $SUMMARY_LOG"

# 记录系统信息
{
    echo "========================================" 
    echo "系统环境信息"
    echo "========================================"
    echo "构建时间: $(date)"
    echo "主机名: $(hostname)"
    echo "操作系统: $(uname -a)"
    echo "CPU信息: $(lscpu | grep 'Model name' | cut -d: -f2 | xargs)"
    echo "内存信息: $(free -h | grep '^Mem:' | awk '{print $2 " 总内存, " $3 " 已使用, " $7 " 可用"}')"
    echo "磁盘空间: $(df -h . | tail -1 | awk '{print $4 " 可用空间"}')"
    echo "CMake版本: $(cmake --version | head -1)"
    echo "GCC版本: $(gcc --version | head -1)"
    echo "Make版本: $(make --version | head -1)"
    echo "========================================"
} >> "$BUILD_LOG"

# 设置环境变量，避免anaconda3干扰
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin"
log_info "已设置环境变量PATH: $PATH"

# ========================================
# 创建构建目录
# ========================================

if [ ! -d "./build_all" ]; then
    log_info "创建构建目录..."
    mkdir build_all
else
    log_info "使用已有构建目录..."
fi

cd build_all

# ========================================
# CMake配置阶段
# ========================================

log_header "CMake 配置阶段"
log_info "开始CMake配置..."

# 执行CMake配置并记录输出
{
    echo "CMake配置开始时间: $(date)"
    echo "CMake命令: cmake -DCMAKE_BUILD_TYPE=Release .."
    echo "----------------------------------------"
} >> "$BUILD_LOG"

cmake -DCMAKE_BUILD_TYPE=Release .. 2>&1 | tee -a "$BUILD_LOG"
CMAKE_EXIT_CODE=${PIPESTATUS[0]}
if [ $CMAKE_EXIT_CODE -eq 0 ]; then
    log_success "CMake配置成功"
else
    log_error "CMake配置失败（退出码: $CMAKE_EXIT_CODE）"
    exit 1
fi

# ========================================
# 编译阶段
# ========================================

log_header "编译阶段"
log_info "开始并行编译（使用 $COMPILE_JOBS 个线程）..."
log_progress "编译输出将同时显示在终端和日志文件中..."

# 记录编译开始时间
COMPILE_START_TIME=$(date +%s)

{
    echo "编译开始时间: $(date)"
    echo "编译命令: make -j$COMPILE_JOBS"
    echo "线程数: $COMPILE_JOBS"
    echo "----------------------------------------"
} >> "$BUILD_LOG"

# 执行编译并同时记录输出、错误和警告
# 使用tee将输出同时显示在终端和写入日志
echo "" | tee -a "$BUILD_LOG"  # 添加空行以便更好的可读性
make -j$COMPILE_JOBS 2>&1 | tee -a "$BUILD_LOG" | tee /tmp/build_output_$$.tmp
MAKE_EXIT_CODE=${PIPESTATUS[0]}
echo "" | tee -a "$BUILD_LOG"  # 添加空行

# 提取警告和错误（编译完成后）
# 改进的警告检测：匹配实际的警告消息，排除文件名中的warning
grep -i "warning:" /tmp/build_output_$$.tmp >> "$WARNING_LOG" 2>/dev/null || true

# 改进的错误检测：匹配实际的错误消息，排除文件名中的error
# 匹配常见的错误模式：
# - "error:" 开头的编译器错误
# - "Error " 开头的CMake/make错误  
# - "*** Error" 的make错误
# - 排除正常的编译输出如 "error_private.c.o"
grep -E "(^[^:]*:[^:]*:\s*error:|^Error\s|^\*\*\*\s*Error|\berror\s*:|make.*Error)" /tmp/build_output_$$.tmp | grep -v -E "(Building|Linking).*error_.*\.(c|cpp|o|so|a)(\s|$)" >> "$ERROR_LOG" 2>/dev/null || true
rm -f /tmp/build_output_$$.tmp

COMPILE_END_TIME=$(date +%s)
COMPILE_TIME=$((COMPILE_END_TIME - COMPILE_START_TIME))

if [ $MAKE_EXIT_CODE -eq 0 ]; then
    log_success "编译成功完成"
    log_info "编译耗时: ${COMPILE_TIME} 秒"
else
    log_error "编译失败"
    echo "详细错误信息请查看: $ERROR_LOG" | tee -a "$BUILD_LOG"
    exit 1
fi

# ========================================
# 构建结果统计
# ========================================

log_header "构建结果统计"

# 统计构建产物
LIBS_COUNT=$(find . -name "*.so" -o -name "*.a" 2>/dev/null | wc -l)
BINS_COUNT=$(find . -type f -executable -not -name "*.so" 2>/dev/null | wc -l)
WARNING_COUNT=$(wc -l < "$WARNING_LOG" 2>/dev/null || echo 0)
ERROR_COUNT=$(wc -l < "$ERROR_LOG" 2>/dev/null || echo 0)

# 计算总构建时间
END_TIME=$(date +%s)
TOTAL_BUILD_TIME=$((END_TIME - START_TIME))

# 磁盘使用统计
BUILD_SIZE=$(du -sh . 2>/dev/null | cut -f1)

# 记录详细统计信息
{
    echo "========================================"
    echo "构建完成统计报告"
    echo "========================================"
    echo "构建时间戳: $BUILD_TIMESTAMP"
    echo "总构建时间: ${TOTAL_BUILD_TIME} 秒"
    echo "编译时间: ${COMPILE_TIME} 秒"
    echo "并行线程数: $COMPILE_JOBS"
    echo "----------------------------------------"
    echo "构建产物统计:"
    echo "- 生成库文件: $LIBS_COUNT 个"
    echo "- 生成可执行文件: $BINS_COUNT 个"
    echo "- 构建目录大小: $BUILD_SIZE"
    echo "----------------------------------------"
    echo "质量统计:"
    echo "- 警告数量: $WARNING_COUNT"
    echo "- 错误数量: $ERROR_COUNT"
    echo "----------------------------------------"
    echo "日志文件:"
    echo "- 完整构建日志: $BUILD_LOG"
    echo "- 警告日志: $WARNING_LOG"
    echo "- 错误日志: $ERROR_LOG"
    echo "========================================"
    echo "构建完成时间: $(date)"
    echo "========================================"
} | tee "$SUMMARY_LOG"

# 在终端显示摘要
echo "========================================"
echo "构建完成统计:"
echo "- 生成库文件: $LIBS_COUNT 个"
echo "- 生成可执行文件: $BINS_COUNT 个"
echo "- 构建耗时: ${TOTAL_BUILD_TIME} 秒"
echo "- 编译耗时: ${COMPILE_TIME} 秒"
echo "- 并行线程数: $COMPILE_JOBS"
echo "- 警告数量: $WARNING_COUNT"
echo "- 错误数量: $ERROR_COUNT"
echo "========================================"

# 创建最新构建日志的软链接
ln -sf "$(basename "$BUILD_LOG")" "$LATEST_LOG"

log_success "构建脚本执行完成"
log_info "详细日志已保存到: $BUILD_LOG"

if [ $WARNING_COUNT -gt 0 ]; then
    log_warning "发现 $WARNING_COUNT 个警告，详情请查看: $WARNING_LOG"
fi

if [ $ERROR_COUNT -gt 0 ]; then
    log_warning "发现 $ERROR_COUNT 个错误记录，详情请查看: $ERROR_LOG"
fi

echo "📋 查看构建摘要: cat $SUMMARY_LOG"
echo "📋 查看最新日志: cat $LATEST_LOG"